package cgroup

import (
	"errors"
	"fmt"
	"os"
	"path"
)

// 达成控制组的层级关系
// 比如在 /sys/fs/cgroup/memory/ 下创建newgrp这个层级
func JoinHierarchy(subsystem string, grpName string) (string, error) {
	cgroupRoot := findCgroupPath(subsystem)
	if cgroupRoot == "" {
		return "", fmt.Errorf("找不到%s的控制组", subsystem)
	}

	// 构造新的组，即 /sys/fs/cgroup/memory/{$grpName}
	cgroupPath := path.Join(cgroupRoot, grpName)

	// 不存在则创建
	_, err := os.Stat(cgroupPath)
	if err != nil && os.IsNotExist(err) {
		err = os.Mkdir(cgroupPath, 0755)
		return cgroupPath, err
	}

	if err == nil {
		return cgroupPath, nil
	} else {
		return cgroupPath, errors.New("create cgroup error")
	}
}
